#import <Foundation/Foundation.h>
#import "FSUser.h"

extern NSString * const     FSGroupChangeNotification;		//团创建或注销或刷新
extern NSString * const     FSGroupUpdateNotification;		//团属性更新通知

//团分类
typedef NS_ENUM(uint, FSGroupType) {
	FSGroupTypeRunning		,		//跑步
	FSGroupTypeCycling		,		//骑行
	FSGroupTypeWalking		,		//步行
	FSGroupTypeOther		,		//其它
};

typedef NS_ENUM(uint, FSGroupJoin) {
	FSGroupJoinVerify		,		//需要验证
	FSGroupJoinNone			,		//所有人可加入
	FSGroupJoinReject		,		//拒绝所有人加入
};

typedef NS_ENUM(uint, FSGroupInvite) {
	FSGroupInviteOwner		,		//只可圈主邀请
	FSGroupInviteAdmin		,		//管理员可邀请
	FSGroupInviteMember		,		//团成员可邀请
};

//团设置
typedef struct {
	uint		distance	: 7;	//团最少打卡距离（1代表100米， 0~100：0~10km）
	uint		target		: 9;	//成员每月目标距离（1代表1000米，1~500：1~500km）
	
	FSGroupJoin		join	: 3;    //加入权限
	FSGroupInvite	invite	: 2;	//邀请权限
} FSGroupSettings;

typedef NS_ENUM(NSUInteger, FSGroupState) {
	FSGroupStateReview		,		//审核状态（团会出现在创建者列表，除编辑资料外不可进行任何操作。等待通过）
	FSGroupStateDisable		,		//关闭状态（团临时关闭，不可进行任何操作，应当给予成员相关提示）
	FSGroupStateNormal		,		//常规状态（安全，团可正常运营）
	FSGroupStateReport		,		//被举报（团被举报过多时，不可进行常规操作，创建者对违规内容进行整改，超期则删除团。应当给予成员相关提示）
};

@class FSGroup, FSUser;
typedef void(^FSGroupResult) (FSGroup *groups, NSError *error);
typedef void(^FSGroupsResult) (NSArray<FSGroup *> *groups, NSError *error);
typedef void(^FSMembersResult) (NSArray<FSUser *> *members, NSError *error);

//团
#pragma mark - 团
@interface FSGroup : NSObject <NSCopying>

+ (void)create:(FSGroup *)group result:(FSServerResult)result;		//创建团
+ (void)revoke:(FSGroup *)group result:(FSServerResult)result;		//注销团

+ (NSArray <FSGroup *> *)groups;		//返回登录用户的团（本地）
+ (id)refresh;							//刷新当前用户的团列表
+ (id)refreshWithResult:(FSServerResult)result;				//刷新登录用户的团列表，并回调

//发现团（按开始位置及条数获取相关团，若成功则返回团对象数组，数组数量小于要求条数时说明没有更多团了）
+ (id)recommendWithRange:(NSRange)range result:(FSGroupsResult)result;						//推荐团
+ (id)nearbyWithRange:(NSRange)range result:(FSGroupsResult)result;							//附近(同城)团
+ (id)searchWithKey:(NSString *)key range:(NSRange)range result:(FSGroupsResult)result;		//查找团

- (instancetype)initWithParam:(NSDictionary *)param;		//初始化团

#pragma mark - 团属性
//若当前用户不是团成员时，以下内容部分不可用
@property (nonatomic, readonly) uint			gid;		//团ID
@property (nonatomic, readonly) uint			owner;		//团所有者ID
@property (nonatomic, readonly) uint			member;		//团成员数
@property (nonatomic, readonly) uint			level;		//团级别
@property (nonatomic, readonly) FSGroupState	state;		//团当前状态
@property (nonatomic, readonly) NSDate			*createTime;//团创建时间

//当前用户为团所有者时，可以设置以下属性
@property (nonatomic, copy)		NSString		*name;		//团名称
@property (nonatomic, copy)		NSString		*signature;	//团口号
@property (nonatomic, copy)		NSString		*summary;	//团简介

@property (nonatomic, assign)	NSUInteger		country;	//团所在国家
@property (nonatomic, assign)	NSUInteger		province;	//团所在省份
@property (nonatomic, assign)	NSUInteger		city;		//团所在城市

@property (nonatomic, assign)	FSGroupType		type;		//团分类
@property (nonatomic, assign)	uint			sport;		//团支持打卡的运动项目
@property (nonatomic, assign)	FSGroupSettings	settings;	//团设置

//图像
- (void)setImage:(UIImage *)image;		//仅创建或编辑团时有效
- (void)setCover:(UIImage *)cover;		//仅创建或编辑团时有效
//通过下面方法来异步获取，以此减少内存使用
- (id)imageWithDefault:(UIImage *)image result:(FSLoadImageResult)result;
- (id)coverWithDefault:(UIImage *)image result:(FSLoadImageResult)result;

#pragma mark - 团数据
@property (nonatomic, readonly) FSRecordTotal	*record;

//团当前用户设置
@property (nonatomic, readonly) BOOL			isJoined;	//登录用户是否已加入本团
@property (nonatomic, copy)		NSString		*username;	//登录用户在团中的名称（支持修改，成员列表时请使用成员的username属性）

#pragma mark - 团操作
- (id)refresh;
- (id)refreshWithResult:(FSServerResult)result;		//刷新团

- (BOOL)beginEdit;			//开始编辑用户资料（仅限圈主，备份当前资料以便取消），可以编辑时返回YES
- (void)cancelEdit;			//取消编辑（恢复编辑前的资料）
- (id)saveWithResult:(FSServerResult)result;		//保存团属性（自动判断需要保存的属性）

#pragma mark - 团成员
- (NSArray <FSUser *> *)members;					//返回成员对象数组（本地）
- (id)addMember:(FSUser *)member result:(FSServerResult)result;			//添加成员(拉人权限决定普通成员是否可以添加成员)
- (id)removeMember:(FSUser *)member result:(FSServerResult)result;		//移除成员(仅管理员)

//获取服务器上的成员，若range.location=0 则总会最先返回uids指定成员（常用于圈主），否则返回排除uids指定的成员
- (id)loadMemberWithRange:(NSRange)range uids:(NSArray<NSNumber *> *)uids result:(FSMembersResult)result;

- (id)joinWithResult:(FSServerResult)result;		//发现或查找后，非成员用户可加入当前团
- (id)leaveWithResult:(FSServerResult)result;		//登录用户不是所有者时，离开并删除当前团

#pragma mark - 团打卡
- (NSArray<FSRecord *> *)supportRecords;			//本地支持打卡的记录
- (NSArray<FSRecord *> *)signRecords;				//今日打卡记录
- (uint)signMember;			//今日打卡人数
- (id)signWithReocrds:(NSArray<FSRecord *> *)records result:(FSServerResult)result;		//打卡（支持多个记录打卡）

@end
